#ifndef STUDENTTERMINAL_H
#define STUDENTTERMINAL_H

#include <QMainWindow>
#include <QButtonGroup>
#include <map>
#include <QVector>
#include <QJsonObject>
#include <QTimer>
#include <QCamera>
#include <QCameraInfo>
#include <QCameraImageCapture>
#include <QCameraViewfinder>
#include <QTcpSocket>
#include <memory>

#include "questioncollect.h"
#include "subjectcollection.h"
#include "define.h"
#include "networkmanager.h"

namespace Ui {
class StudentTerminal;
}

struct ExamPaper
{
public:
    ExamPaper(){}; // 默认构造
    ExamPaper(QString question, QVector<QString> options, QString answer, int score):
        m_question(question), m_options(options), m_answer(answer), m_score(score){ }
public:
    QString m_question;         // 题目
    QVector<QString> m_options; // ABCD选项
    QString m_answer;           // 答案
    int m_score;                // 题目的分值
};

class StudentTerminal : public QMainWindow
{
    Q_OBJECT

public:
    explicit StudentTerminal(QWidget *parent = nullptr,NetworkManager *networkManager = nullptr);
    ~StudentTerminal();

private:
    // void parseQuestionOption();  // 根据服务器传递的json格式的题目和选项

    // void downLoadExamTopicHandle(bool IsSuccess, const QJsonObject& obj);  // 下载题目

    void loadCameraModuleStart();               // 加载相机模块启动
#if 0
    void updateLcdShow();   // 更新LCD显示
    void imageCaptured(int id,const QImage &preview);   // 保存图片帧
    void exitExam();    // 退出考试（交卷/时间结束）
    QString answerIdAnswerString(int idx);      // 将按钮组的ID转答案（A.B.C.D）
    int answerStringAnswerId(QString answer);   // 将答案（A.B.C.D）转按钮组ID号


public slots:
    void showPaperSubjectSlot(int id);  // 根据不同的题号, 显示不同的题目
    void submitExamSlot();              // 交卷
    void remainTimeRefreshSlot();       // 剩余时间刷新
    void captureImageSlot();            // 定时截图
    void selectAnswerSlot(int idx);     // 选择答案
    void imageCaptureSlot();            // 截图
    void saveImageSlot(int id, const QImage & preview);      // 保存图片
    void loadCompleteSlot();            // 加载题目完成
#endif
private:
    Ui::StudentTerminal *ui;
    QTcpSocket socket;              // 用于实现TCP网络通信

    /* 按钮组 */
    QButtonGroup * m_answerButtonGroup;
    /* 按钮个数 */
    const int m_buttonNums = 20;
    /* 字典 - 题号-题目映射对 */
    std::map<int, ExamPaper> m_paperPair;
    /* 字典 - 题号 - 答案映射对 (答题卡) */
    std::map<int, QString> m_answerPair;
    /* 定时器1 : 剩余时间刷新定时器 */
    QTimer * m_remainTimer;
    /* 定时器2 : 截图定时器 */
    QTimer * m_screenTimer;
    /* 剩余时间 */
    int m_remainTime;
    /* 当前题号 */
    int m_currentQuestionId;
    /* 总分 */
    int m_totalScore = 0;
    /* 题号 */
    subjectcollection * m_subject;
    /* 题目 */
    questioncollect * m_quesAnswer;
    /* 默认样式风格 */

    QString m_defultStyleSheet;

    /* 摄像头相关的类 */
    /* 相机对象 */
    QCamera * m_camera;
    /* 取景器对象 */
    QCameraViewfinder * m_viewFinder;
    /* 图像捕捉对象 */
    QCameraImageCapture * m_imageCapture;
};

#endif // STUDENTTERMINAL_H
